package com.example.demo.lambda;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.math.BigDecimal;
import java.util.function.*;

public class LambdaTest001 {


    public static void main(String[] args) {
        // 定义一个断言对象，用于判断学生的身高是否大于185
        Predicate<Integer> predicate = x -> x > 185;

        // 创建一个学生对象，姓名为"9龙"，年龄为23岁，身高为175cm
        Student student = new Student("9龙", 23, 175);

        // 输出"9龙的身高高于185吗？：true"，其中使用断言对象对学生的身高进行判断
        System.out.println("9龙的身高高于185吗？：" + predicate.test(student.getStature()));

        // 创建一个Consumer对象，用于打印字符串
        Consumer<String> consumer = System.out::println;

        // 使用Consumer对象接受字符串"命运由我不由天"并进行打印输出
        consumer.accept("命运由我不由天");

        // 创建一个Function对象，用于获取学生对象的姓名
        Function<Student, String> function = Student::getName;

        // 使用Function对象获取学生对象的姓名并输出
        String name = function.apply(student);
        System.out.println(name);

        // 创建一个Supplier对象，返回值为BigDecimal.TEN的整数值
        Supplier<Integer> supplier =
                () -> Integer.valueOf(BigDecimal.TEN.toString());

        // 使用Supplier对象获取整数值并输出
        System.out.println(supplier.get());

        // 创建一个UnaryOperator对象，用于将传入的布尔值取反
        UnaryOperator<Boolean> unaryOperator = uglily -> !uglily;

        // 使用UnaryOperator对象对布尔值进行取反并输出结果
        Boolean apply2 = unaryOperator.apply(true);
        System.out.println(apply2);

        // 创建一个BinaryOperator对象，用于两个整数相乘
        BinaryOperator<Integer> operator = (x, y) -> x * y;

        // 使用BinaryOperator对象对两个整数进行相乘运算并输出结果
        Integer integer = operator.apply(2, 3);
        System.out.println(integer);

        // 调用test方法，传入一个Runnable对象，用于演示函数式接口的使用
        test(() -> "我是一个演示的函数式接口");
    }


    /**
     * 演示自定义函数式接口使用
     *
     * @param worker
     */
    public static void test(Worker worker) {
        String work = worker.work();
        System.out.println(work);
    }

    public interface Worker {
        String work();
    }
// 9龙的身高高于185吗？：false
// 命运由我不由天
// 9龙
// 10
// false
// 6
// 我是一个演示的函数式接口


    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public static class Student {
        private String name;
        private Integer age;
        private Integer stature;

    }
}
